<!DOCTYPE html> 
<html>
<head>
<title>Skyline75489</title>
<meta charset='utf-8'>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="../static/styles/github.css">
<link rel="stylesheet" href="../static/post.css">
</head>
<body>

<div class="wrapper">
<div class="header">
	<span class="blog-name">Skyline75489</span>

<a class="nav" href="../index.html">Home</a>
<a class="nav" href="about.html">About</a>
</div>
<div class="content">

<h1>(译)PyMOTW(1)——数据持久化和数据交换</h1>
<p>Python提供了若干个用于存储数据的模块。总体看来，数据持久化有两个层面，一个是将内存中的对象转化成特定格式用于存储，另一个是想办法将转换后的数据存储起来。</p>
<h3>1.1 对象序列化</h3>
<p>Python 包含了两个可以将对象转化成可存储格式（序列化）的模块：<code>pickle</code>和<code>json</code>。<code>pickle</code>的使用最为广泛，因为它的C实现效率很高，而且和其他存储序列化后数据的标准库模块结合的很好，例如<code>shelve</code>。Web应用可能更倾向于使用<code>json</code>，因为它和已有的Web存储程序可以进行更好的交互。</p>
<h3>1.2 存储序列化对象</h3>
<p>当内存中的对象转换成可以存储的格式之后，下一步要做的就是选择如何存储数据了。如果数据不需要被索引取出，那么包含一个接一个序列化对象的普通文件就足够了。如果需要的话，Python还包含了一系列的模块，让我们可以使用其DBM格式存储数据，从而实现在一个小型数据库里存储键-值对数据。</p>
<p>使用DBM格式最简单的方法莫过于使用<code>shelve</code>。打开一个<code>shelve</code>文件，就可以通过类似词典的API访问到里面的数据。存储到<code>shelve</code>里的对象会自动进行<code>pickle</code>处理，不需要我们额外的工作。</p>
<p>使用<code>shelve</code>的一个缺点是，使用现有的接口，我们没办法知道下层使用了哪种DBM格式。如果你的应用不需要在安装了不同类库的不同机器上交换数据，那么这个缺点就没多大关系。反之，你可以使用<code>shelve</code>模块中的一些类来确保使用特定的格式。</p>
<p>如果你打算使用<code>json</code>来交换大量的数据，使用<code>json</code>和<code>anydbm</code>是另一种办法。在这种情况下，DBM数据库的键和值的类型全部都是字符串，因此对象在取出数据库之后，不会自动重建，可能需要你手动处理。</p>
<h3>1.3 关系数据库</h3>
<p>sqlite3是一个优秀的单进程(?,in-process)关系数据库，可以在大部分Python版本中使用。它使用内存或本地文件来存储数据，所有数据库操作都在一个进程之内进行，所以不会有网络延迟。sqlite3的兼容特性让它变得极其适合嵌入在桌面应用和Web应用的开发版本中。</p>
<p>默认情况下，所有数据库操作均通过Python的DBI 2.0 API来实现，没有ORM的介入。最流行的通用ORM是<a href="http://www.sqlalchemy.com">SQLAlchemy</a>。Django的原生ORM和其它一些ORM也都支持SQLite。SQLAlchemy很容易进行安装和设置。如果你的对象不是很复杂，同时你很关系开销问题，那么你应该考虑直接使用DBI接口。</p>
<h3>1.4 使用标准格式进行数据交换</h3>
<p>尽管CSV(Comma-Separated-Value)通常并不认为是一种真正的持久化格式，使用CSV在应用程序之间进行数据交互确实是一种很高效的方法。大部分电子表格程序和数据库都支持导入和导出CSV格式。因此在很多情况下，想把数据从你的应用导入到分析工具中最简单的方法，就是将数据用CSV格式导出。</p>


</div>
</div>
<script src="../static/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</body>

</html>
